/*************************************************************************
	> File Name: wmark_dev.h
	> Author: 
	> Mail: 
	> Created Time: 2022年01月29日 星期六 16时57分58秒
 ************************************************************************/

#ifndef _WMARK_DEV_H
#define _WMARK_DEV_H

// 调整 dma_buf 的数量 
#define DMA_BUFS_MAX_NUM 4

typedef enum {
	TYPE_STR,
	TYPE_PNG,
} picture_type;

typedef  struct {
	uint8_t r;
	uint8_t g;
	uint8_t b;
	uint8_t a;
} bg_color_t; // Background color

typedef struct {
	uint8_t id1;
	uint8_t id2;
	uint8_t id3;
	uint8_t id4;
} face_id_t;

typedef struct {
	uint32_t en; // enable
	uint32_t ch; // channel
	uint32_t w;
	uint32_t h;
	uint32_t x;
	uint32_t y;
	uint32_t len; // 正常情况下 len = w * h * ch
	bg_color_t bg;
	face_id_t face_id;
} display_arg_t;

typedef struct {
	picture_type type;
	display_arg_t display;
} picture_t;

typedef struct {
	uint32_t wmark_buf_id; // 将携带 水印内容的 buf ,保存在 client 中，第几个 wmark_buf 中。
	picture_t picture;
} info_t;

// 单个 wmark_buf 传递时，需要的数据结构
typedef struct {
	uint32_t index; // 对应 dma_buf 的 索引
	info_t info; // 携带 wmark_buf 对应的控制信息
} wmark_buf_t;

// 初始化 wmark_buf 时，需要传递的参数
typedef struct {
	uint32_t num; // 需要在 client 创建 wmark_buf 的数量
	uint64_t len; // wmark_buf 的大小
}init_wmark_bufs_t;

typedef struct {
	uint32_t fd;
	uint32_t index;
	uint64_t buf_len;
}dma_info_t;

// 初始化 dma_buf 时，所需要的数据结构
typedef struct {
	uint32_t dma_buf_num;
	dma_info_t dma_fds[DMA_BUFS_MAX_NUM];
}init_dma_bufs_t;

// 初始化 dma_bufs 使用
#define SET_INIT_DMA_BUFS           _IOWR('S', 12, init_dma_bufs_t)
#define GET_INIT_DMA_BUFS           _IOWR('S', 13, init_dma_bufs_t)

// 初始化 wmark_bufs 使用
#define SET_INIT_WMARK_BUFS         _IOWR('S', 14, init_wmark_bufs_t)
#define GET_INIT_WMARK_BUFS         _IOWR('S', 15, init_wmark_bufs_t)

// 只提供给 export 使用
#define GET_FREE_BUF_INDEX_EXPORT   _IOWR('S', 16, wmark_buf_t) // 获取 释放的 buf index
#define SET_USE_BUF_INDEX_EXPORT    _IOWR('S', 17, wmark_buf_t) // 写入 填空好的 buf index

// 只提供给 import 使用
#define GET_USE_BUF_INDEX_IMPORT    _IOWR('S', 18, wmark_buf_t)  // 获取 有用的 buf index
#define SET_FREE_BUF_INDEX_IMPORT   _IOWR('S', 19, wmark_buf_t) //  写入 释放的 buf index

// 状态机相关的结构体以及宏
typedef enum {
	S_M_OPEN_EX,
	S_M_INIT_OK_EX,
	S_M_INIT_ERROR_EX,
	S_M_CLOSE_EX,

	S_M_OPEN_IM,
	S_M_INIT_OK_IM,
	S_M_INIT_ERROR_IM,
	S_M_CLOSE_IM,
}state_type_enum;

typedef struct {
	state_type_enum state; // 此时状态
} control_msg_t;

#define GET_MSG_CTL                 _IOWR('S', 20, control_msg_t) // 获得 msg 信息
#define SET_MSG_CTL                 _IOWR('S', 21, control_msg_t) // 获得 msg 信息

#endif
